<?php

/**
 * GodSon实现的SAE排名类
 * @see btboys
 * @copyright btboys
 * btboys
 */
class SaeRank{
    const rankprefix = 'GodSon_Rank_';
    const baseurl = 'http://127.0.0.1/mahuohuo/rank.php';
    private $errno = 'SAE_Success';
    private $errmsg ="OK";
    /**
     * 构造对象
     *
     */
    function __construct() {
		//GodSon
    }
    
    /**
     * 取得错误码
     *
     * @return int 
     * @author GodSon
     */
    public function errno() 
    {
        return $this->errno;
    }
    
    /**
     * 取得错误信息
     *
     * @return string 
     *  @author GodSon
     */
    public function errmsg() 
    {
        return $this->errmsg;
    }
    
    /**
     * 设置key
     *
     * 只有使用其他应用的key时才需要调用
     *
     * @param string $accesskey 
     * @param string $secretkey 
     * @return void 
     *  @author GodSon
     */
    public function setAuth( $accesskey, $secretkey){
    }
    
    /**
     * 创建排行榜
     * 
     * @param string $namespace 排行榜的命名空间，namespace的最大长度为128个字节
     * @param int $number 排行榜中key的数量，上限为10000，超出则失败，errno：-1
     * @param int $expire 排行榜失效时间，单位（分min）
     * @return bool 成功返回true，失败返回false。<br />
     *  注意：排名的起止区间为[0, $number-1]，即排名为1时返回排名为0
     * @author GodSon
     */
    function create($namespace, $number, $expire=0){
		return wincache_ucache_add(self::rankprefix.$namespan ,array('number'=>$number,'rank'=>array()) ,$expire*60);
    }
    
    /**
     * 设置或添加key，value
     * 
     * @param string $namespace 排行榜的命名空间
     * @param string $key 排行榜中的元素的名称,key的长度最大为256个字节
     * @param int $value 要设置的值
     * @param bool $rankReturn 是否返回排名的标识
     * @return int   当rankReturn=true时，返回更新后元素的排名，失败返回false。<br />
     *                当rankReturn=fasle时，成功返回true，失败返回false。
     * @author GodSon
     */
    function set($namespace, $key, $value, $rankReturn=false){
		$w_key = self::rankprefix.$namespan;
		
		if(!wincache_ucache_exists($w_key))
		{
			$this->errno = -4;
			return false;
		}
			
		$w_value = wincache_ucache_get($w_key);
		
		$number = $w_value['number'];
		$rank = $w_value['rank'];
		if(count($rank) == $number)
		{
			$this->errno = -1;
			return false;
		}
		
		$m_key=substr($key,0,256);
		$rank[] = array($m_key,$value);
		$w_value['rank'] = $rank;
		wincache_ucache_set($w_key,$w_value);
		
		if($rankReturn)
		{
			return count($rank);
		}
		else
		{
			return true;
		}
    }
    
    /**
     * 在排行榜元素$key的值的基础上加$value
     * 
     * @param string $namespace 排行榜的命名空间
     * @param string $key 排行榜中的元素的名称，key的长度最大为256个字节
     * @param int $value 值的增量。
     * @param bool $rankReturn 是否返回排名的标识
     * @return int     当rankReturn=true时，返回更新后元素的排名，失败返回false。<br />
     *                 当rankReturn=fasle时，成功返回true，失败返回false。
     * @author GodSon
     */
    function increase($namespace, $key, $value, $rankReturn=false){
		$w_key = self::rankprefix.$namespan;
		
		if(!wincache_ucache_exists($w_key))
		{
			$this->errno = -4;
			return false;
		}
		
		$w_value = wincache_ucache_get($w_key);
		$m_key=substr($key,0,256);
		$rank = $w_value['rank'];
		$newRank = array();
		foreach($rank as $value){
			if(isset($value[$m_key])){
				$value[$m_key] = $value[$m_key]+$value;
			}
			$newRank[] = $value;
		}
		
		$w_value['rank'] = $newRank;
		wincache_ucache_set($w_key,$w_value);
		
		if($rankReturn)
		{
			return count($rank);
		}
		else
		{
			return true;
		}
    }
    
    /**
     * 在排行榜元素$key的值的基础上减$value
     * 
     * @param string $namespace 排行榜的命名空间
     * @param string $key 排行榜中的元素的名称，key的长度最大为256个字节
     * @param int $value 值的减量。
     * @param bool $rankReturn 是否返回排名的标识
     * @return int     当rankReturn=true时，返回更新后元素的排名，失败返回false。<br />
     *                 当rankReturn=false时，成功返回true，失败返回false。<br />
     *                 当元素$key的值改变后，排名不在排行榜的存储范围内，返回false。
     * @author GodSon
     */
    function decrease($namespace, $key, $value, $rankReturn=false){
		$w_key = self::rankprefix.$namespan;
		
		if(!wincache_ucache_exists($w_key))
		{
			$this->errno = -4;
			return false;
		}
		
		$w_value = wincache_ucache_get($w_key);
		$m_key=substr($key,0,256);
		$rank = $w_value['rank'];
		$newRank = array();
		foreach($rank as $value){
			if(isset($value[$m_key])){
				$value[$m_key] = $value[$m_key]-$value;
			}
			$newRank[] = $value;
		}
		
		$w_value['rank'] = $newRank;
		wincache_ucache_set($w_key,$w_value);
		
		if($rankReturn)
		{
			return count($rank);
		}
		else
		{
			return true;
		}
    }
    
    /**
     * 获得元素的排名
     * 
     * @param string $namespace 排行榜的命名空间
     * @param string $key 排行榜中的元素的名称，key的长度最大为256个字节
     * @return int     成功时返回$key在排行榜中的排名，失败返回false。
     */
    function getRank($namespace, $key){
		$w_key = self::rankprefix.$namespan;
		
		if(!wincache_ucache_exists($w_key))
		{
			$this->errno = -4;
			return false;
		}
		
		$w_value = wincache_ucache_get($w_key);
		$rank = $w_value['rank'];
		$m_key=substr($key,0,256);
		$i = 0;
		foreach($rank as $value){
			if(isset($value[$m_key])){
				break;
			}
			$i++;
		}
		return $i;
    }
    
    /**
     * 删除排行榜中的元素$key
     * 
     * @param string $namespace 排行榜的命名空间
     * @param string $key 排行榜中的元素的名称，key的长度最大为256个字节
     * @param bool $rankReturn 是否返回排名的标识
     * @return int     当rankReturn=true时，返回删除前元素的排名，失败返回false。<br />
     *                 当rankReturn=false时，成功返回true，失败返回false。
     * @author GodSon
     */
    function delete($namespace, $key, $rankReturn=false){
		$w_key = self::rankprefix.$namespan;
		
		if(!wincache_ucache_exists($w_key))
		{
			$this->errno = -4;
			return false;
		}
		
		$w_value = wincache_ucache_get($w_key);
		$rank = $w_value['rank'];
		$m_key=substr($key,0,256);
		$i = 0;
		foreach($rank as $value){
			if(isset($value[$m_key])){
				unset($rank[$i]);
				break;
			}
			$i++;
		}
		$w_value['rank'] = $rank;
		wincache_ucache_set($w_key,$w_value);
		
		if($rankReturn){
			return $i;
		}else{
			return true;
		}
		
    }
    
    /**
     * 获得实时排行榜数据
     * 
     * @param string $namespace 排行榜的命名空间
     * @param bool $order 返回结果是否有序的标识
     * @param int $offsetFrom 希望获得的起始排名，可选，仅当order为true时有效
     * @param int $offsetTo 希望获得的终止排名，可选，仅当order为true时有效
     * @return array 返回值的形式：array（array（key，value) ....)<br />
     *  注意：offsetFrom和offsetTo的取值区间为[0, $number-1]
     *  当order=true时，返回排名在[offsetFrom,offsetTo]之间的有序的结果，offsetFrom<offsetTo ，不设置时返回所有结果。<br />
     *     当order=false时，返回的结果不是有序的。<br />
     *  失败时返回false。
     * @author GodSon
     */
    function getList($namespace, $order=false, $offsetFrom=0, $offsetTo=PHP_INT_MAX){
		$w_key = self::rankprefix.$namespan;
		
		if(!wincache_ucache_exists($w_key))
		{
			$this->errno = -4;
			return false;
		}
		
		$w_value = wincache_ucache_get($w_key);
		return $w_value['rank'];
    }
    
    /**
     * 获得应用中现有排行榜名称
     * 
     * @return array 返回值的形式：array（rank1，rank2，....) <br />
     *  成功返回应用中所有排行榜的名称，失败返回false。
     * @author GodSon
     */
    function getAllName(){
		return wincache_ucache_info();
    }
    
    /**
     * 获得排行榜的具体信息
     * 
     * @param string $namespace 排行榜的命名空间
     * @return array 返回值的形式：array（info1，info2，....) <br />
     *  成功返回包括排行榜的具体信息，失败返回false。
     * @author GodSon
     */
    function getInfo($namespace){
        $w_key = self::rankprefix.$namespan;
        return wincache_ucache_get($w_key);
    }
    /**
     * 清除数据
     * 
     * @param string $namespace 排行榜的命名空间
     * @return int  成功返回true，失败返回false。
     * @author GodSon
     */
    function clear($namespace){
		$w_key = self::rankprefix.$namespan;
		wincache_ucache_delete($w_key);
    }

}

?>
